﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace FlyingCircusWebIS.Models
{
    public class FormaPagamentoService : IFormaPagamentoService
    {

        private IFormaPagamentoDAO formaPagamentoDAO;
        private IReservaDAO reservaDAO;

        public FormaPagamentoService()
        {
            formaPagamentoDAO = new FormaPagamentoDAO();
            reservaDAO = new ReservaDAO();
        }

        public void Adicionar(FormaPagamento entidade)
        {
            formaPagamentoDAO.Adicionar(entidade);
        }

        public List<ValidationResult> ValidarEntidade(FormaPagamento entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool edicao = false;
            if (entidade.IdPagamento != 0)
                edicao = true;

            if (edicao)
            {
                List<ValidationResult> errosAtualizar = ValidaAtualizar(entidade);
                if (errosAtualizar != null)
                    erros.AddRange(errosAtualizar);
            }
            else
            {
                List<ValidationResult> errosAdicionar = ValidaAdicionar(entidade);
                if (errosAdicionar != null)
                    erros.AddRange(errosAdicionar);
            }

            return erros;
        }

        public List<ValidationResult> ValidaAdicionar(FormaPagamento entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existeNome = formaPagamentoDAO.Listar().Any(e => e.Descricao.Equals(entidade.Descricao, StringComparison.InvariantCultureIgnoreCase));
            if (existeNome)
                erros.Add(new ValidationResult("Já existe um registro com a descrição informada."));


            return erros;
        }


        public List<ValidationResult> ValidaAtualizar(FormaPagamento entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existeNome = formaPagamentoDAO.Listar().Any(e => e.Descricao.Equals(entidade.Descricao, StringComparison.InvariantCultureIgnoreCase)
                                                    && e.IdPagamento != entidade.IdPagamento);
            if (existeNome)
                erros.Add(new ValidationResult("Já existe um registro com a descrição informada."));


            return erros;
        }

        public void Atualizar(FormaPagamento entidade)
        {
            formaPagamentoDAO.Atualizar(entidade);
        }

        public FormaPagamento BuscarPorId(int id)
        {
            return formaPagamentoDAO.BuscarPorId(id);
        }

        public void AtivarPorId(int id)
        {
            formaPagamentoDAO.AtivarPorId(id);
        }

        public void DesativarPorId(int id)
        {
            formaPagamentoDAO.DesativarPorId(id);
        }

        public List<FormaPagamento> Listar()
        {
            return formaPagamentoDAO.Listar();
        }

        public List<FormaPagamento> ListarAtivos()
        {
            return formaPagamentoDAO.Listar().FindAll(fp => fp.FlagAtivo.Equals("S"));
        }

        public List<ValidationResult> ValidaRemoverPorId(int id)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existe = formaPagamentoDAO.Listar().Any(e => e.IdPagamento == id);
            if (!existe)
                erros.Add(new ValidationResult("NaoExiste", "O registro solicitado não existe."));


            bool temDependencia = reservaDAO.Listar().Any(e => e.IdPagamento == id);
            if (temDependencia)
                erros.Add(new ValidationResult("Dependencia", "O registro tem dependência em outro contexto."));

            return erros;
        }

        public void RemoverPorId(int id)
        {
            formaPagamentoDAO.RemoverPorId(id);
        }

        public List<SelectListItem> ListarItensFormaDePagamento()
        {
            List<FormaPagamento> registro = formaPagamentoDAO.Listar();
            List<SelectListItem> itens = converterRegistrosFormaPagamentoParaItens(registro);

            return itens;
        }

        public List<SelectListItem> ListarItensAtivosFormaDePagamento()
        {
            List<FormaPagamento> registro = ListarAtivos();
            List<SelectListItem> itens = converterRegistrosFormaPagamentoParaItens(registro);

            return itens;
        }

        private List<SelectListItem> converterRegistrosFormaPagamentoParaItens(List<FormaPagamento> registro)
        {
            List<SelectListItem> itens = new List<SelectListItem>();

            if (registro.Count == 0)
            {
                itens.Add(new SelectListItem { Text = "<Nenhum>", Value = "" });
            }
            else
            {
                itens.Add(new SelectListItem { Text = "<Selecione>", Value = "" });
                foreach (var formaPagamento in registro)
                {
                    itens.Add(new SelectListItem { Text = formaPagamento.Descricao, Value = formaPagamento.IdPagamento.ToString() });
                }
            }

            return itens;
        }
    }
}